package learnMethod

import (
	"fmt"
	"strconv"
	"strings"
)

func TestString() {
	//1、统计字符串长度 len(str)
	str := "guai"
	fmt.Println("str.length:", len(str)) //str.length: 4

	//2、字符串遍历解决中问乱码问题（因为golang中在遍历时一般是通过字节遍历的容易导致乱码）
	//方式一：
	str2 := "guai 乖"
	r := []rune(str2)
	for i := 0; i < len(r); i++ {
		fmt.Printf("%c", r[i]) //guai 乖
	}

	fmt.Println()
	//方式二
	for _, val := range str2 {
		fmt.Printf("%c", val) //guai 乖
	}
	fmt.Println()

	//3、字符串转整数
	//基本类型转字符串 方法一
	intVar := 12
	strVar := fmt.Sprintf("%d", intVar)
	fmt.Println("strVar:", strVar) //strVar: 12

	//将字符串转化为整数 error用来接收转化过程中的错误信息
	strVar1 := "121q"
	intVar1, error := strconv.Atoi(strVar1)
	//error不为空转化出错，输出错误结果
	if error != nil {
		fmt.Println("转换失败:", error)
	} else {
		fmt.Println("转换成功：", intVar1) //转换失败: strconv.Atoi: parsing "121q": invalid syntax
	}

	//4、整数转字符串
	intVar2 := 12
	strVar2 := strconv.Itoa(intVar2)
	fmt.Println("strVar2:", strVar2) //strVar2: 12

	//5、字符串转byte[]
	var bytes = []byte("hello world")
	fmt.Printf("bytes: %v\n", bytes) //bytes: [104 101 108 108 111 32 119 111 114 108 100]

	//6、[]byte转字符串
	strVar3 := string([]byte{104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100})
	fmt.Println("strVar3:", strVar3) //strVar3: hello world

	//7、查找是否存在指定字串：strings.Contains("seafood","foo")
	if strings.Contains("hello world", "hello") {
		fmt.Println("true") //true
	}

	//8、统计一个字符串中有几个指定的子串： strings.Count（"hello","l")
	fmt.Println("hello 中的 l 个数:", strings.Count("hello", "l")) //hello 中的 l 个数: 2

	//9、字符串比较
	//不区分大小写的比较
	fmt.Println("result:", strings.EqualFold("HELLO", "heLlo")) //result: true
	//区分大小写的比较
	fmt.Println("result:", "HELLO" == "heLlo") //result: false

	//10、返回字串在字符串中第一次出现的位置 如果没有返回-1
	fmt.Println("子串在字符串中第一次出现的位置", strings.Index("Hello", "ll")) //子串在字符串中第一次出现的位置 2

	//11、返回字串在字符串中最后一次出现的位置,如果没有返回-1
	fmt.Println("子串在字符串中最后一次出现的位置：", strings.LastIndex("hellohello", "ll")) //子串在字符串中最后一次出现的位置： 7

	//12、将指定的字串替换成另一个字串
	strVar4 := "hello world world"
	//-1表示替换所有world 也可以指定其它个数
	strVar5 := strings.Replace(strVar4, "world", "guai", 1)
	fmt.Println("替换后的strVar5：", strVar5) //替换后的strVar5： hello guai guai

	//13、按照指定的某个字符，为分割标识，将一个字符串拆分成字符串数组
	strArr := strings.Split("hello world", " ")
	for i := 0; i < len(strArr); i++ {
		fmt.Printf("strArr[%d]: %v", i, strArr[i])
	} //strArr[0]: hellostrArr[1]: world
	fmt.Println()

	//15、将字符串左右两边的指定的字符去掉
	fmt.Println(strings.Trim("!Hello World!", "!")) //Hello World

	//16、将字符串两边的空格去掉
	fmt.Println("|", strings.TrimSpace(" Hello World "), "|") //| Hello World |

	//17、指定去掉字符串一边的字符
	fmt.Println(strings.TrimLeft("!Hello world!", "!"))  //Hello world!
	fmt.Println(strings.TrimRight("!Hello world!", "!")) //!Hello world

	//18、判断字符串是否以指定的字符串开头或结尾
	fmt.Println(strings.HasPrefix("Hello World", "Hello")) //true
	fmt.Println(strings.HasSuffix("Hello World", "World")) //true

	//19:将字符串的字母进行大小写转换
	str5 := "hello,golong"
	upper := strings.ToUpper(str5)
	fmt.Println(upper)

	lower := strings.ToLower(upper)
	fmt.Println(lower)

	fold := strings.EqualFold("hell", "hello")
	fmt.Println(fold)
	fmt.Println('a')
	containsRune := strings.ContainsRune("abc", 97)
	fmt.Println(containsRune)

	any := strings.ContainsAny("hello", "cc")
	fmt.Println(any)

	count := strings.Count("aabbccaa", "aa")
	fmt.Println(count)

	title := strings.Title("hello,world")
	fmt.Println(title)
}
